/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Modelo.PersistenciaJDBC;
import Modelo.Entidades.Alumno;
import Modelo.Entidades.AlumnoImpl;
import Modelo.Entidades.Pregunta;
import Modelo.Entidades.PreguntaImpl;
import Modelo.Entidades.Respuesta;
import Modelo.Entidades.RespuestaContestada;
import Modelo.Entidades.RespuestaContestadaImpl;
import Modelo.Entidades.RespuestaImpl;
import Modelo.Entidades.TareaImpl;
import Modelo.Entidades.TareaRealizada;
import Modelo.Entidades.TareaRealizadaImpl;
import Modelo.Persistencia.TareaRealizadaDAO;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;

/*
 *  Proyecto eJAM [G12]
 *  Miembros:
 *      - Javier Ruiz Hidalgo
 *      - Adrian Ramos Cápitas
 *      - Miguel Alejandro Esteban Ordóñez
 */

public class TareaRealizadaDAOJDBC implements TareaRealizadaDAO{

    public void create(TareaRealizada entidad) {
        String sqlTR = "INSERT INTO TAREA_REALIZADA(DNI, NOMBRE, DURACION, F_REALIZACION, NOTA) VALUES (?,?,?,?,?)";
        String sqlRC = "INSERT INTO RESPUESTA_CONTESTADA(DNI, NOMBRE, NUM_P, NUM_R) VALUES (?,?,?,?)";

        try {
            //Introducción de Informacion en la tabla TAREA_REALIZADA
            PreparedStatement stm = Persistencia.createConnection().prepareStatement(sqlTR);
            stm.setString(1, entidad.getAlumno().getDNI());
            stm.setString(2, entidad.getTarea().getNombre());
            stm.setTime(3, entidad.getDuracion());
            java.sql.Timestamp timestamp = new java.sql.Timestamp(entidad.getF_realizacion().getTime());
            stm.setTimestamp(4, timestamp);
            stm.setDouble(5, entidad.getNota());
            stm.execute();

            //Introducción de Informacion en la tabla RESPUESTA_CONTESTADA
            for(RespuestaContestada rc: entidad.getRespuestasContestadas()){
                stm = Persistencia.createConnection().prepareStatement(sqlRC);
                stm.setString(1, entidad.getAlumno().getDNI());
                stm.setString(2, entidad.getTarea().getNombre());
                stm.setInt(3, rc.getPregunta().getNumP());
                stm.setInt(4, rc.getRespuesta().getNumR());
                stm.execute();
            }

        } catch (SQLException e) {
            System.out.println(e);
        } finally {
            Persistencia.closeConnection();
        }
    }

    public TareaRealizada read(String pk) {
        //Metodo no contemplado
        return null;
    }

    public void update(TareaRealizada entidad) {
        //Metodo no contemplado
    }

    public void delete(TareaRealizada entidad) {
        try {
            Statement stmt = Persistencia.createConnection().createStatement();
            stmt.executeUpdate("DELETE FROM RESPUESTA_CONTESTADA WHERE NOMBRE = '" +entidad.getTarea().getNombre()+ "' AND DNI = '" +entidad.getAlumno().getDNI()+ "'");
            stmt.executeUpdate("DELETE FROM TAREA REALIZADA WHERE NOMBRE = '" +entidad.getTarea().getNombre()+ "' AND DNI = '" +entidad.getAlumno().getDNI()+ "'");

        } catch (SQLException e) {
            System.out.println(e);
        } finally {
            Persistencia.closeConnection();
        }
    }

    public List<TareaRealizada> list() {
        List<TareaRealizada> tareasRealizadas = new ArrayList<TareaRealizada>();
        TareaRealizada tareaRealizada = null;
        RespuestaContestada respuestaContestada = null;
        Pregunta p = null;
        Respuesta r = null;

        try {
            Statement stmt = Persistencia.createConnection().createStatement();
            ResultSet resPC, resP, resR, resTR;
            String nombre1, dni1, descripcion1, descripcion2;
            Time duracion;
            int numP, numR1, numR2, rCorrecta;
            Date fRealizacion;
            double nota;

            resTR = stmt.executeQuery("SELECT * FROM TAREA_REALIZADA");
            while (resTR.next()) {
                nombre1 = resTR.getString("NOMBRE");
                dni1 = resTR.getString("DNI");
                duracion = resTR.getTime("DURACION");
                fRealizacion = new Date(resTR.getTimestamp("F_REALIZACION").getTime());
                nota = resTR.getDouble("NOTA");
                tareaRealizada = new TareaRealizadaImpl(new AlumnoImpl(dni1), new TareaImpl(nombre1),  duracion, fRealizacion, nota);
                tareasRealizadas.add(tareaRealizada);
            }

            for(TareaRealizada tr: tareasRealizadas){
                tr.setAlumno((Alumno)new UsuarioDAOJDBC().read(tr.getAlumno().getDNI()));
                tr.setTarea(new TareaDAOJDBC().read(tr.getTarea().getNombre()));

                stmt = Persistencia.createConnection().createStatement();
                resPC = stmt.executeQuery("SELECT * FROM RESPUESTA_CONTESTADA WHERE NOMBRE = '" +tr.getTarea().getNombre()+ "' AND DNI = '" +tr.getAlumno().getDNI()+ "'");
                while (resPC.next()) {
                    numP = resPC.getInt("NUM_P");
                    numR1 = resPC.getInt("NUM_R");
                    p = new PreguntaImpl(numP);
                    r = new RespuestaImpl(numR1);
                    respuestaContestada = new RespuestaContestadaImpl(p, r);
                    tr.addRespuestaContestada(respuestaContestada);
                }

                for(RespuestaContestada rc: tr.getRespuestasContestadas()){
                    resP = stmt.executeQuery("SELECT * FROM PREGUNTA WHERE NOMBRE = '" +tr.getTarea().getNombre()+ "' AND NUM_P = '" +rc.getPregunta().getNumP()+ "'");
                    if(resP.next()){
                        descripcion1 = resP.getString("DESCRIPCION");
                        rCorrecta = resP.getInt("R_CORRECTA");
                        rc.getPregunta().setDescripcion(descripcion1);
                        rc.getPregunta().setrCorrecta(rCorrecta);
                    }

                    resR = stmt.executeQuery("SELECT * FROM RESPUESTA WHERE NOMBRE = '" +tr.getTarea().getNombre()+ "' AND NUM_P = '" +rc.getPregunta().getNumP()+ "'");
                    while(resR.next()){
                        numR2 = resR.getInt("NUM_R");
                        descripcion2 = resR.getString("DESCRIPCION");
                        r = new RespuestaImpl(numR2, descripcion2);
                        rc.getPregunta().addRespuesta(r);

                        if(rc.getRespuesta().getNumR() == numR2){
                            rc.setRespuesta(r);
                        }
                    }
                }
            }

        } catch (SQLException e) {
            System.out.println(e);
        } finally {
            Persistencia.closeConnection();
        }
        return tareasRealizadas;
    }

    public List<TareaRealizada> listByDNI(String DNI) {
        List<TareaRealizada> tareasRealizadas = new ArrayList<TareaRealizada>();
        TareaRealizada tareaRealizada = null;
        RespuestaContestada respuestaContestada = null;
        Pregunta p = null;
        Respuesta r = null;

        try {
            Statement stmt = Persistencia.createConnection().createStatement();
            ResultSet resPC, resP, resR, resTR;
            String nombre1, dni1, descripcion1, descripcion2;
            Time duracion;
            int numP, numR1, numR2, rCorrecta;
            Date fRealizacion;
            double nota;

            resTR = stmt.executeQuery("SELECT * FROM TAREA_REALIZADA WHERE DNI = '" +DNI+ "'");
            while (resTR.next()) {
                nombre1 = resTR.getString("NOMBRE");
                dni1 = resTR.getString("DNI");
                duracion = resTR.getTime("DURACION");
                fRealizacion = new Date(resTR.getTimestamp("F_REALIZACION").getTime());
                nota = resTR.getDouble("NOTA");
                tareaRealizada = new TareaRealizadaImpl(new AlumnoImpl(dni1), new TareaImpl(nombre1),  duracion, fRealizacion, nota);
                tareasRealizadas.add(tareaRealizada);
            }

            for(TareaRealizada tr: tareasRealizadas){
                tr.setAlumno((Alumno)new UsuarioDAOJDBC().read(tr.getAlumno().getDNI()));
                tr.setTarea(new TareaDAOJDBC().read(tr.getTarea().getNombre()));

                stmt = Persistencia.createConnection().createStatement();
                resPC = stmt.executeQuery("SELECT * FROM RESPUESTA_CONTESTADA WHERE NOMBRE = '" +tr.getTarea().getNombre()+ "' AND DNI = '" +tr.getAlumno().getDNI()+ "'");
                while (resPC.next()) {
                    numP = resPC.getInt("NUM_P");
                    numR1 = resPC.getInt("NUM_R");
                    p = new PreguntaImpl(numP);
                    r = new RespuestaImpl(numR1);
                    respuestaContestada = new RespuestaContestadaImpl(p, r);
                    tr.addRespuestaContestada(respuestaContestada);
                }

                for(RespuestaContestada rc: tr.getRespuestasContestadas()){
                    resP = stmt.executeQuery("SELECT * FROM PREGUNTA WHERE NOMBRE = '" +tr.getTarea().getNombre()+ "' AND NUM_P = '" +rc.getPregunta().getNumP()+ "'");
                    if(resP.next()){
                        descripcion1 = resP.getString("DESCRIPCION");
                        rCorrecta = resP.getInt("R_CORRECTA");
                        rc.getPregunta().setDescripcion(descripcion1);
                        rc.getPregunta().setrCorrecta(rCorrecta);
                    }

                    resR = stmt.executeQuery("SELECT * FROM RESPUESTA WHERE NOMBRE = '" +tr.getTarea().getNombre()+ "' AND NUM_P = '" +rc.getPregunta().getNumP()+ "'");
                    while(resR.next()){
                        numR2 = resR.getInt("NUM_R");
                        descripcion2 = resR.getString("DESCRIPCION");
                        r = new RespuestaImpl(numR2, descripcion2);
                        rc.getPregunta().addRespuesta(r);

                        if(rc.getRespuesta().getNumR() == numR2){
                            rc.setRespuesta(r);
                        }
                    }
                }
            }

        } catch (SQLException e) {
            System.out.println(e);
        } finally {
            Persistencia.closeConnection();
        }
        return tareasRealizadas;
    }

    public TareaRealizada read(String pkAlumno, String pkTarea) {
        TareaRealizada tareaRealizada = null;
        RespuestaContestada respuestaContestada = null;
        Pregunta p = null;
        Respuesta r = null;

        try {
            Statement stmt = Persistencia.createConnection().createStatement();
            ResultSet resPC, resP, resR, resTR;
            String nombre1, dni1, descripcion1, descripcion2;
            Time duracion;
            int numP, numR1, numR2, rCorrecta;
            Date fRealizacion;
            double nota;

            resTR = stmt.executeQuery("SELECT * FROM TAREA_REALIZADA WHERE NOMBRE = '" + pkTarea+ "' AND DNI = '" +pkAlumno+ "'");
            if (resTR.next()) {
                nombre1 = resTR.getString("NOMBRE");
                dni1 = resTR.getString("DNI");
                duracion = resTR.getTime("DURACION");
                fRealizacion = new Date(resTR.getTimestamp("F_REALIZACION").getTime());
                nota = resTR.getDouble("NOTA");
                tareaRealizada = new TareaRealizadaImpl(new AlumnoImpl(dni1), new TareaImpl(nombre1),  duracion, fRealizacion, nota);
            }

            tareaRealizada.setAlumno((Alumno)new UsuarioDAOJDBC().read(tareaRealizada.getAlumno().getDNI()));
            tareaRealizada.setTarea(new TareaDAOJDBC().read(tareaRealizada.getTarea().getNombre()));

            stmt = Persistencia.createConnection().createStatement();
            resPC = stmt.executeQuery("SELECT * FROM RESPUESTA_CONTESTADA WHERE NOMBRE = '" +tareaRealizada.getTarea().getNombre()+ "' AND DNI = '" +tareaRealizada.getAlumno().getDNI()+ "'");
            while (resPC.next()) {
                numP = resPC.getInt("NUM_P");
                numR1 = resPC.getInt("NUM_R");
                p = new PreguntaImpl(numP);
                r = new RespuestaImpl(numR1);
                respuestaContestada = new RespuestaContestadaImpl(p, r);
                tareaRealizada.addRespuestaContestada(respuestaContestada);
            }

            for(RespuestaContestada rc: tareaRealizada.getRespuestasContestadas()){
                resP = stmt.executeQuery("SELECT * FROM PREGUNTA WHERE NOMBRE = '" +tareaRealizada.getTarea().getNombre()+ "' AND NUM_P = '" +rc.getPregunta().getNumP()+ "'");
                if(resP.next()){
                    descripcion1 = resP.getString("DESCRIPCION");
                    rCorrecta = resP.getInt("R_CORRECTA");
                    rc.getPregunta().setDescripcion(descripcion1);
                    rc.getPregunta().setrCorrecta(rCorrecta);
                }

                resR = stmt.executeQuery("SELECT * FROM RESPUESTA WHERE NOMBRE = '" +tareaRealizada.getTarea().getNombre()+ "' AND NUM_P = '" +rc.getPregunta().getNumP()+ "'");
                while(resR.next()){
                    numR2 = resR.getInt("NUM_R");
                    descripcion2 = resR.getString("DESCRIPCION");
                    r = new RespuestaImpl(numR2, descripcion2);
                    rc.getPregunta().addRespuesta(r);

                    if(rc.getRespuesta().getNumR() == numR2){
                        rc.setRespuesta(r);
                    }
                }
            }

        } catch (SQLException e) {
            System.out.println(e);
        } finally {
            Persistencia.closeConnection();
        }
        return tareaRealizada;
    }

    public boolean isRealizada(String pkAlumno, String pkTarea) {
        boolean confirmacion = false;

        try {
            Statement stmt = Persistencia.createConnection().createStatement();
            ResultSet res;

            res = stmt.executeQuery("SELECT * FROM TAREA_REALIZADA WHERE NOMBRE = '" + pkTarea+ "' AND DNI = '" +pkAlumno+ "'");

            if (res.next()) {
                confirmacion = true;
            }
            
        } catch (SQLException e) {
            System.out.println(e);
        } finally {
            Persistencia.closeConnection();
        }
        return confirmacion;
    }

}
